/**
 * 网络请求工具函数
 */
import { getAccessToken, clearAuthInfo } from './auth'

// 服务器基础URL
const BASE_URL = 'http://localhost:48080'

/**
 * 请求封装
 * @param {Object} options - 请求选项
 * @param {string} options.url - 请求地址
 * @param {string} options.method - 请求方法
 * @param {Object} options.data - 请求数据
 * @param {Object} options.params - URL参数
 * @param {Object} options.headers - 请求头
 * @returns {Promise} 请求结果
 */
function request(options) {
  return new Promise((resolve, reject) => {
    // 获取本地存储的token
    const token = getAccessToken()
    
    // 构建请求头
    const headers = {
      'Content-Type': 'application/json',
      'tenant-id': '1', // 添加租户标识，默认使用1作为租户ID
      ...options.headers
    }
    
    // 如果有token，添加到请求头
    if (token) {
      headers['Authorization'] = 'Bearer ' + token
    }
    
    // 发起请求
    uni.request({
      url: BASE_URL + options.url,
      method: options.method || 'GET',
      data: options.data,
      header: headers,
      success: (res) => {
        // 请求成功，但需要检查业务状态码
        if (res.statusCode === 200) {
          // 业务状态码判断
          if (res.data.code === 0) {
            // 业务成功
            resolve(res.data)
          } else {
            // 业务失败
            uni.showToast({
              title: res.data.msg || '请求失败',
              icon: 'none',
              duration: 2000
            })
            reject(res.data)
          }
        } else if (res.statusCode === 401) {
          // 未授权，需要登录
          uni.showToast({
            title: '登录已过期，请重新登录',
            icon: 'none',
            duration: 2000
          })
          
          // 清除本地认证信息
          clearAuthInfo()
          
          // 跳转到登录页
          setTimeout(() => {
            uni.navigateTo({
              url: '/pages/login/index'
            })
          }, 1000)
          
          reject(res.data)
        } else {
          // 其他HTTP错误
          uni.showToast({
            title: '网络请求错误：' + res.statusCode,
            icon: 'none',
            duration: 2000
          })
          reject(res)
        }
      },
      fail: (err) => {
        // 请求失败
        uni.showToast({
          title: '网络请求失败',
          icon: 'none',
          duration: 2000
        })
        reject(err)
      }
    })
  })
}

export default request
